home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / awe / awe-full.lha / Awe2 / DoNotUseThisSrc / MonitorSimMux.cc < prev    next >
C/C++ Source or Header  |  1990-08-08  |  2KB  |  84 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. // 
  3. // Copyright (C) 1988 University of Illinois, Urbana, Illinois
  4. //
  5. // written by Dirk Grunwald (grunwald@cs.uiuc.edu)
  6. //
  7.  
  8. #ifdef __GNUG__
  9. #  pragma implementation
  10. #endif
  11.  
  12. #include "MonitorSimMux.h"
  13. #include "SpinBarrier.h"
  14. #include "Statistic.h"
  15. #include "SpinFetchAndOp.h"
  16. #include "AwesimeConfig.h"
  17.  
  18. static SpinLock statsLock;
  19. static Statistic ThreadsPerTick;
  20. static int threadsThisTick[MaxCpuMultiplexors];
  21.  
  22. extern int CpuMuxDebugFlag;
  23.  
  24. MonitorSimMux *ThisMonitorSimMux;
  25.  
  26. MonitorSimMux::MonitorSimMux(int debug, int maxloops) : (debug, maxloops)
  27. {
  28.     CpuMultiplexor::pNameTemplate = "MonitorSimMux";
  29.     ThisMonitorSimMux = this;
  30.     sprintf(CpuMultiplexor::nameSpace, "[%s-%d] ",
  31.         CpuMultiplexor::pNameTemplate, CpuMultiplexor::iYam);
  32.     CpuMultiplexor::pName = CpuMultiplexor::nameSpace;
  33. }
  34.  
  35. void
  36. MonitorSimMux::stirItAround()
  37. {
  38.     while( ! *MultiSimMux::terminated )
  39.     {
  40.     MultiSimMux::stirItAround();
  41. #ifndef NDEBUG
  42.     if (CpuMuxDebugFlag) {
  43.         CpuCerrLock.reserve();
  44.         cerr << name() << "Finished with current batch, advance time\n";
  45.         CpuCerrLock.release();
  46.     }
  47. #endif /*NDEBUG*/
  48.     int added = advanceTime();
  49.  
  50.     threadsThisTick[MultiSimMux::iYam] += added;
  51.  
  52.     cpuBarrier -> rendezvous();
  53.  
  54.     if (MultiSimMux::iYam == 0) {
  55.         int total = 0;
  56.         for (int i = 0 ; i < CpuMultiplexors; i++ ) {
  57.         total += threadsThisTick[i];
  58.         threadsThisTick[i] = 0;
  59.         }
  60.         double dtotal = double(total);
  61.         ThreadsPerTick += dtotal;
  62.     }
  63.     }
  64. }
  65.  
  66. void
  67. MonitorSimMux::coolItDown()
  68. {
  69.     MultiSimMux::coolItDown();
  70.     
  71.     CpuCerrLock.reserve();
  72.     cerr << name() << "Statistics for threads per tick\n";
  73.     cerr << name() << ThreadsPerTick << "\n";
  74.     cerr << name() << "Min = " << ThreadsPerTick.min() << "\n";
  75.     cerr << name() << "Max = " << ThreadsPerTick.max() << "\n";
  76.     CpuCerrLock.release();
  77. }
  78.  
  79. Statistic *
  80. MonitorSimMux::threadsPerTick()
  81. {
  82.     return (&ThreadsPerTick);
  83. }
  84.